import CONST from "@/const/global";
import store from '@/store'
import deepCopy from "@/util/deepCopyUtil";
import router, {authRoutes, ruleMapping} from "@/router";
import sessionApi from "@/api/sessionApi";
import {get} from "../network/http"

/**
 * @描述 异步获取 vuex 菜单数据 通过 回调函数把数据带出去
 * @param fallback 回调参数
 * @码农 丁昌江
 * @日期 2021/2/18 18:27
 */
function getAllMenu(fallback) {
    //dispatch方法中的回调函数then的参数r就是action中我们写的返回值
    store.dispatch("getAllMenuTree").then(r => {
        if (fallback) {
            fallback(r);
        }
    });
}

function putAuthList(menuVoList){
    // 深拷贝权限头部，然后迭代菜单数据，是菜单类型（nodeType=2）的获取其routerUrl和component
    let tmpAuthRoutes = deepCopy(authRoutes)

    //组件名称与权限按钮的对应关系
    let routerButtonMap ={}
    //路由与组件名称的对应关系
    let routerNameMap = {}
    function iteration(menuVoList) {
        menuVoList.forEach((menuItem) => {
            if (menuItem.nodeType === '2' &&  menuItem.routerUrl && menuItem.component) {
                let param = {};
                param.path = menuItem.routerUrl;
                param.component = ruleMapping[menuItem.component];
                param.meta = {title:menuItem.name}

                tmpAuthRoutes.children.push(param)
                //按钮权限组装
                let buttonArr = []
                if (menuItem.childMenu){
                    menuItem.childMenu.forEach((child)=>{
                        buttonArr.push(child.name)
                    })
                    routerButtonMap[menuItem.name] = buttonArr
                }

                routerNameMap[menuItem.routerUrl] = menuItem.name
            }

            if (menuItem.childMenu) {
                iteration(menuItem.childMenu)
            }
        })
    }

    iteration(menuVoList);
    //console.log(tmpAuthRoutes)
    router.addRoutes([tmpAuthRoutes])

    //把菜单数据放session和vuex中
    sessionApi.saveAuthList(menuVoList)
    store.dispatch("putRouterButtonMap", routerButtonMap).then(() =>{
    })
    store.dispatch("putRouterNameMap", routerNameMap).then(() =>{
    })

    return store.dispatch("putAuthList",menuVoList)
}


/**
 * @描述 刷新vuex菜单数据，先清空vuex菜单数据，再清空session缓存；通过回调获取最新数据
 * @码农 丁昌江
 * @日期 2021/2/18 18:29
 */
function refreshMenu(fallback) {
    store.commit("clearMenuTree");
    sessionStorage.removeItem(CONST.MENU_KEY);
    getAllMenu(fallback)
}

/**
 * @描述 异步刷新vuex角色数据，调用该方法会网络请求所有角色，且存入session和vuex中
 * @码农 丁昌江
 * @日期 2021/2/18 18:29R
 */
function getAllRole(fallback) {
    store.dispatch("getAllRole").then((r)=>{
        if (fallback) {
            fallback(r);
        }
    })
}

function getDictMap() {
    get("dict/getDictMap").then(({data})=>{
        store.dispatch("putDictMap",data)
    })
}

export default {
    getAllMenu,
    refreshMenu,
    getAllRole,
    putAuthList,
    getDictMap
}

